package com.skiving.cloud.admin.service.impl;

import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.solon.service.impl.ServiceImpl;
import com.skiving.cloud.admin.entity.SysTenantMenu;
import com.skiving.cloud.common.utils.PageParameter;
import com.skiving.cloud.admin.entity.SysMenu;
import com.skiving.cloud.admin.mapper.SysMenuMapper;
import com.skiving.cloud.admin.service.SysMenuService;
import org.noear.solon.annotation.Component;
import org.noear.solon.Utils;

import java.util.List;

/**
 * 菜单管理 服务层实现。
 *
 * @author skivingcloud
 * @since 2025-03-08
 */
@Component
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu>  implements SysMenuService {
    /**
     * 分页查询菜单管理
     *
     * @param parameter 查询参数
     * @return 分页查询结果
     */
    @Override
    public Page<SysMenu> queryByPage(PageParameter<SysMenu> parameter){
        Page<SysMenu> page = new Page<>(parameter.getPage(), parameter.getPageSize());
        QueryWrapper queryWrapper = QueryWrapper.create();
        if (parameter.getParam() != null) {
            //查询条件
            if (Utils.isNotBlank(parameter.getParam().getId())) {
                queryWrapper.and(SysMenu::getId).like(parameter.getParam().getId());
            }
            if (Utils.isNotBlank(parameter.getParam().getParentId())) {
                queryWrapper.and(SysMenu::getParentId).like(parameter.getParam().getParentId());
            }
            if (Utils.isNotBlank(parameter.getParam().getName())) {
                queryWrapper.and(SysMenu::getName).like(parameter.getParam().getName());
            }
            if (Utils.isNotBlank(parameter.getParam().getAlias())) {
                queryWrapper.and(SysMenu::getAlias).like(parameter.getParam().getAlias());
            }
            if (Utils.isNotBlank(parameter.getParam().getUrl())) {
                queryWrapper.and(SysMenu::getUrl).like(parameter.getParam().getUrl());
            }
            if (Utils.isNotBlank(parameter.getParam().getPerms())) {
                queryWrapper.and(SysMenu::getPerms).like(parameter.getParam().getPerms());
            }
            if (Utils.isNotBlank(parameter.getParam().getType())) {
                queryWrapper.and(SysMenu::getType).like(parameter.getParam().getType());
            }
            if (Utils.isNotBlank(parameter.getParam().getIcon())) {
                queryWrapper.and(SysMenu::getIcon).like(parameter.getParam().getIcon());
            }
            if (Utils.isNotBlank(parameter.getParam().getSysResource())) {
                queryWrapper.and(SysMenu::getSysResource).like(parameter.getParam().getSysResource());
            }
            if (Utils.isNotBlank(parameter.getParam().getTenantId())) {
                queryWrapper.and(SysMenu::getTenantId).like(parameter.getParam().getTenantId());
            }
            if (Utils.isNotBlank(parameter.getParam().getTerminal())) {
                queryWrapper.and(SysMenu::getTerminal).like(parameter.getParam().getTerminal());
            }
            if (Utils.isNotBlank(parameter.getParam().getCreater())) {
                queryWrapper.and(SysMenu::getCreater).like(parameter.getParam().getCreater());
            }
            if (Utils.isNotBlank(parameter.getParam().getModUser())) {
                queryWrapper.and(SysMenu::getModUser).like(parameter.getParam().getModUser());
            }
            if (Utils.isNotBlank(parameter.getParam().getRedirect())) {
                queryWrapper.and(SysMenu::getRedirect).like(parameter.getParam().getRedirect());
            }
            if (Utils.isNotBlank(parameter.getParam().getIsHide())) {
                queryWrapper.and(SysMenu::getIsHide).like(parameter.getParam().getIsHide());
            }
            if (Utils.isNotBlank(parameter.getParam().getIsKeepAlive())) {
                queryWrapper.and(SysMenu::getIsKeepAlive).like(parameter.getParam().getIsKeepAlive());
            }
            if (Utils.isNotBlank(parameter.getParam().getIsAffix())) {
                queryWrapper.and(SysMenu::getIsAffix).like(parameter.getParam().getIsAffix());
            }
        }
        return this.page(page, queryWrapper);
    }

    /**
     * 查询树形菜单
     *
     * @return 树形菜单
     */
    @Override
    public List<SysMenu> getMenuList() {
        QueryWrapper queryWrapper = QueryWrapper.create().orderBy("order_num");
        List<SysMenu> listAll = this.list(queryWrapper);
        return listAll.stream().filter(item -> {
            item.setChildren(listAll.stream().filter(e -> e.getParentId().equals(item.getId())).toList());
            return item.getParentId().equals("0");
        }).toList();
    }

    /**
     * 查询租户有权限的资源树
     *
     * @param tenantId 租户ID
     * @return 树形菜单
     */
    @Override
    public List<SysMenu> getTenantMenuList(String tenantId) {
        QueryWrapper queryWrapper = QueryWrapper.create().from(SysMenu.class).as("m").join(SysTenantMenu.class).as("tm").on(
                wrapper -> wrapper.where(SysMenu::getId).eq(SysTenantMenu::getMenuId)
        ).where(SysTenantMenu::getTenantId).eq(tenantId);
        List<SysMenu> listAll = this.mapper.selectListByQuery(queryWrapper);
        return listAll.stream().filter(item -> {
            item.setChildren(listAll.stream().filter(e -> e.getParentId().equals(item.getId())).toList());
            return item.getParentId().equals("0");
        }).toList();
    }
}
